package org.shj.jvm;

public class FinalizeEscapeGc {
	public static FinalizeEscapeGc Save_Hook = null;
	public void isAlive(){
		System.out.println("yes. I'm still alive.");
	}
	
	//进行垃圾回收时，此方法只会被调用一次，在此方法内，对象有机会可以拯救自己。
	//但是当进行第二次垃圾回收时，此方法不会再被调用。
	//程序员应该忘掉此方法
	protected void finalize() throws Throwable{
		super.finalize();
		System.out.println("finalize() is invoked.");
		FinalizeEscapeGc.Save_Hook = this;
	}
	
	public static void main(String[] args) throws Exception{
		Save_Hook = new FinalizeEscapeGc();
		
		//对象第一次成功拯救自己
		Save_Hook = null;
		System.gc();
		
		//因为finalize方法优先级很低，所以暂停0.5秒以等待它
		Thread.sleep(500);
		if(Save_Hook != null){
			Save_Hook.isAlive();
		}else{
			System.out.println("No. I'm dead.");
		}
		
		//下面这段代码与上面完全相同，但是这次自救却失败了
		Save_Hook = null;
		System.gc();
		
		Thread.sleep(500);
		if(Save_Hook != null){
			Save_Hook.isAlive();
		}else{
			System.out.println("No. I'm dead.");
		}
	}
}
